// 220108 1133

// 全局对象（Global Object）
// global 及其属性

console.log(global);
console.log(global.global); // 同上
console.log(global.performance);
console.log('END.9');

console.log(global.__filename); // undefined
console.log(global.__dirname); // undefined
console.log(__filename); // 当前正在执行的脚本的文件名:文件所在位置的绝对路径
console.log(__dirname); // 当前执行脚本所在的目录
console.log('END.15');

// setTimeout(cb, ms)
function pt2000() {
	console.log('Here is pt2000.' + new Date());
};
console.log("before: " + new Date())
var thandle = setTimeout(pt2000, 2000);
console.log(thandle);
console.log('END.24');

// clearTimeout(t)

// setInterval(cb, ms)
// 在指定的毫秒(ms)数后执行指定函数(cb)
// 可以使用 clearInterval(t) 函数来清除定时器
var pttimes = 0;
function interval2000() {
	console.log('Here is interval2000.' + new Date());
	pttimes += 1;
};
console.log("before: " + new Date())
var ihandle = setInterval(interval2000, 2000);
console.log(ihandle);
console.log('END.37')

// 不完善的终止 interval 方式
// 可以改为使用 EventEmitter TODO
function stopInterval2000() {
	console.log("pttimes=" + pttimes + ', now=' + new Date());
	if (pttimes > 10) {
		console.log('call clearInterval...');
		var ret = clearInterval(ihandle);
		console.log(ret); // undefined
		
	}
};
// 30秒后
setTimeout(stopInterval2000, 30000);
console.log('END.54')

// 220109 1740

console.log('start...');

var counter = 10;
console.log("计数：%d", counter);

var timeTag = '获取数据';
console.time(timeTag);

// do something

console.timeEnd(timeTag);

console.log('END.70')

// process
// 它用于描述当前Node.js 进程状态的对象，提供了一个与操作系统的简单接口。
// 一些最常用的成员方法：exit beforeExit uncaughtException Signal事件

// exit
// 会等待前面的 setTimeout、setInterval 执行完毕
process.on('exit', function(code) {
	// 以下代码永远不会执行
	setTimeout(function(){
		console.log('以下代码永远不会执行');
	}, 0);
	
	console.log('退出码为：', code); // 退出码为： 0，，进程结束，最后输出
});

console.log('END.87')

// 退出状态码:
// 1-10,12,128

// Process 提供了很多有用的属性，便于我们更好的控制系统的交互
// stdout stderr stdin
// argv
// execPath execArgv
// env exitCode 
// version versions config 
// pid title arch platform mainModule 

process.stdout.write('line 100.stdout.write...' + '\n');

process.argv.forEach(function(val, index, array) {
	console.log(index + ': ' + val + ': ' + array);
});

console.log(process.execPath);

console.log(process.version);
console.log(process.versions);
console.log(process.pid);
console.log(process.title);
console.log(process.arch);
console.log(process.platform);
console.log(process.mainModule);

console.log(process.env);
console.log(process.config);

process.stderr.write('END.119'); // 没有换行

console.log(''); // 自动换行

// process 的 方法
console.log('process方法：\n当前目录cwd：' + process.cwd());

console.log("platform=" + process.platform);
if (process.platform != 'win32') {
	// 注意，判断不够严谨
	// 注意：这个函数仅在 POSIX 平台上可用(例如，非Windows 和 Android)。
	console.log('gid: ' + process.getgid());
	// 同上
	console.log('uid: ' + process.getuid());
	// 同上
	console.log('groups:' + process.getgroups());
}

console.log('memoryUsage：\n');
// 包含：rss heapTotal heapUsed external arrayBuffers
console.log(process.memoryUsage());

console.log('uptime: ' + process.uptime());
console.log('hrtime: ' + process.hrtime());

console.log('END.144');
